clipboard: Consistently use GtkTargetList
authorBenjamin Otte <otte@redhat.com>
Tue, 14 Nov 2017 04:34:15 +0000 (05:34 +0100)
committerBenjamin Otte <otte@redhat.com>
Wed, 15 Nov 2017 18:07:16 +0000 (19:07 +0100)
Some code was using GtkTargetList, some used GtkTargetEntry and some
GtkTargetPair.

14 files changed:
demos/gtk-demo/clipboard.c
docs/reference/gtk/gtk4-sections.txt
gtk/gtkclipboard.c
gtk/gtkclipboard.h
gtk/gtkclipboardprivate.h
gtk/gtkentry.c
gtk/gtkfilechooserwidget.c
gtk/gtklabel.c
gtk/gtkselection.c
gtk/gtkselection.h
gtk/gtkselectionprivate.h
gtk/gtktextbuffer.c
tests/testselection.c
testsuite/gtk/clipboard.c

index f0b415480359a682b58ae5f0cb88f71abd0010c8..de9ffd80c85a0edff5273b67daad09fa0814a461 100644 (file)
@@ -320,7 +320,7 @@ do_clipboard (GtkWidget *do_widget)
 
       /* tell the clipboard manager to make the data persistent */
       clipboard = gtk_clipboard_get (GDK_SELECTION_CLIPBOARD);
-      gtk_clipboard_set_can_store (clipboard, NULL, 0);
+      gtk_clipboard_set_can_store (clipboard, NULL);
     }
 
   if (!gtk_widget_get_visible (window))
index 6aa7b283bbad989ef7237e00e2544bd62146503c..683a878f09bc9d154236256de524ce4f22fe189e 100644 (file)
@@ -5227,6 +5227,7 @@ gtk_target_list_ref
 gtk_target_list_unref
 gtk_target_list_add
 gtk_target_list_add_table
+gtk_target_list_merge
 gtk_target_list_add_text_targets
 gtk_target_list_add_image_targets
 gtk_target_list_add_uri_targets
index b066546c023a13a24c47e21b6ae3d318894c5443..5379be87daf089378c7548860f6c03b4562e0675 100644 (file)
@@ -26,6 +26,7 @@
 #include "gtkinvisible.h"
 #include "gtkmain.h"
 #include "gtkmarshalers.h"
+#include "gtkselectionprivate.h"
 #include "gtktextbufferrichtext.h"
 #include "gtkintl.h"
 
@@ -163,8 +164,7 @@ static void gtk_clipboard_finalize     (GObject             *object);
 static void gtk_clipboard_owner_change (GtkClipboard        *clipboard,
                                        GdkEventOwnerChange *event);
 static gboolean gtk_clipboard_set_contents      (GtkClipboard                   *clipboard,
-                                                 const GtkTargetEntry           *targets,
-                                                 guint                           n_targets,
+                                                 GtkTargetList                  *targets,
                                                  GtkClipboardGetFunc             get_func,
                                                  GtkClipboardClearFunc           clear_func,
                                                  gpointer                        user_data,
@@ -175,8 +175,7 @@ static void gtk_clipboard_real_request_contents (GtkClipboard
                                                  GtkClipboardReceivedFunc        callback,
                                                  gpointer                        user_data);
 static void gtk_clipboard_real_set_can_store    (GtkClipboard                   *clipboard,
-                                                 const GtkTargetEntry           *targets,
-                                                 gint                            n_targets);
+                                                 GtkTargetList                  *targets);
 static void gtk_clipboard_real_store            (GtkClipboard                   *clipboard);
 
 
@@ -593,8 +592,7 @@ clipboard_remove_owner_notify (GtkClipboard *clipboard)
          
 static gboolean
 gtk_clipboard_set_contents (GtkClipboard         *clipboard,
-                           const GtkTargetEntry *targets,
-                           guint                 n_targets,
+                           GtkTargetList        *targets,
                            GtkClipboardGetFunc   get_func,
                            GtkClipboardClearFunc clear_func,
                            gpointer              user_data,
@@ -631,8 +629,7 @@ gtk_clipboard_set_contents (GtkClipboard         *clipboard,
       clipboard->clear_func = clear_func;
 
       gtk_selection_clear_targets (clipboard_widget, clipboard->selection);
-      gtk_selection_add_targets (clipboard_widget, clipboard->selection,
-                                targets, n_targets);
+      gtk_selection_add_targets (clipboard_widget, clipboard->selection, targets);
 
       return TRUE;
     }
@@ -643,9 +640,8 @@ gtk_clipboard_set_contents (GtkClipboard         *clipboard,
 /**
  * gtk_clipboard_set_with_data: (skip)
  * @clipboard: a #GtkClipboard
- * @targets: (array length=n_targets): array containing information
- *     about the available forms for the clipboard data
- * @n_targets: number of elements in @targets
+ * @targets: The targets (data formats) in which the
+ *    functions can provide the data
  * @get_func: (scope async): function to call to get the actual clipboard data
  * @clear_func: (scope async): when the clipboard contents are set again,
  *     this function will be called, and @get_func will not be subsequently
@@ -662,8 +658,7 @@ gtk_clipboard_set_contents (GtkClipboard         *clipboard,
  **/
 gboolean
 gtk_clipboard_set_with_data (GtkClipboard          *clipboard,
-                            const GtkTargetEntry  *targets,
-                            guint                  n_targets,
+                            GtkTargetList         *targets,
                             GtkClipboardGetFunc    get_func,
                             GtkClipboardClearFunc  clear_func,
                             gpointer               user_data)
@@ -674,7 +669,6 @@ gtk_clipboard_set_with_data (GtkClipboard          *clipboard,
 
   return GTK_CLIPBOARD_GET_CLASS (clipboard)->set_contents (clipboard,
                                                             targets,
-                                                            n_targets,
                                                            get_func,
                                                             clear_func,
                                                             user_data,
@@ -684,9 +678,8 @@ gtk_clipboard_set_with_data (GtkClipboard          *clipboard,
 /**
  * gtk_clipboard_set_with_owner: (skip)
  * @clipboard: a #GtkClipboard
- * @targets: (array length=n_targets): array containing information
- *     about the available forms for the clipboard data
- * @n_targets: number of elements in @targets
+ * @targets: The targets (data formats) in which the
+ *    functions can provide the data
  * @get_func: (scope async): function to call to get the actual clipboard data
  * @clear_func: (scope async): when the clipboard contents are set again,
  *     this function will be called, and @get_func will not be subsequently
@@ -708,8 +701,7 @@ gtk_clipboard_set_with_data (GtkClipboard          *clipboard,
  **/
 gboolean
 gtk_clipboard_set_with_owner (GtkClipboard          *clipboard,
-                             const GtkTargetEntry  *targets,
-                             guint                  n_targets,
+                             GtkTargetList         *targets,
                              GtkClipboardGetFunc    get_func,
                              GtkClipboardClearFunc  clear_func,
                              GObject               *owner)
@@ -721,7 +713,6 @@ gtk_clipboard_set_with_owner (GtkClipboard          *clipboard,
 
   return GTK_CLIPBOARD_GET_CLASS (clipboard)->set_contents (clipboard,
                                                             targets,
-                                                            n_targets,
                                                            get_func,
                                                             clear_func,
                                                             owner,
@@ -851,29 +842,24 @@ gtk_clipboard_set_text (GtkClipboard *clipboard,
                        const gchar  *text,
                        gint          len)
 {
-  GtkTargetList *list;
-  GtkTargetEntry *targets;
-  gint n_targets;
+  GtkTargetList *targets;
 
   g_return_if_fail (clipboard != NULL);
   g_return_if_fail (text != NULL);
 
-  list = gtk_target_list_new (NULL, 0);
-  gtk_target_list_add_text_targets (list, 0);
+  targets = gtk_target_list_new (NULL, 0);
+  gtk_target_list_add_text_targets (targets, 0);
 
-  targets = gtk_target_table_new_from_list (list, &n_targets);
-  
   if (len < 0)
     len = strlen (text);
   
   gtk_clipboard_set_with_data (clipboard, 
-                              targets, n_targets,
+                              targets,
                               text_get_func, text_clear_func,
                               g_strndup (text, len));
-  gtk_clipboard_set_can_store (clipboard, NULL, 0);
+  gtk_clipboard_set_can_store (clipboard, NULL);
 
-  gtk_target_table_free (targets, n_targets);
-  gtk_target_list_unref (list);
+  gtk_target_list_unref (targets);
 }
 
 static void 
@@ -908,26 +894,21 @@ void
 gtk_clipboard_set_image (GtkClipboard *clipboard,
                          GdkPixbuf    *pixbuf)
 {
-  GtkTargetList *list;
-  GtkTargetEntry *targets;
-  gint n_targets;
+  GtkTargetList *targets;
 
   g_return_if_fail (clipboard != NULL);
   g_return_if_fail (GDK_IS_PIXBUF (pixbuf));
 
-  list = gtk_target_list_new (NULL, 0);
-  gtk_target_list_add_image_targets (list, 0, TRUE);
-
-  targets = gtk_target_table_new_from_list (list, &n_targets);
+  targets = gtk_target_list_new (NULL, 0);
+  gtk_target_list_add_image_targets (targets, 0, TRUE);
 
   gtk_clipboard_set_with_data (clipboard, 
-                              targets, n_targets,
+                              targets,
                               pixbuf_get_func, pixbuf_clear_func,
                               g_object_ref (pixbuf));
-  gtk_clipboard_set_can_store (clipboard, NULL, 0);
+  gtk_clipboard_set_can_store (clipboard, NULL);
 
-  gtk_target_table_free (targets, n_targets);
-  gtk_target_list_unref (list);
+  gtk_target_list_unref (targets);
 }
 
 /**
@@ -2128,9 +2109,9 @@ gtk_clipboard_store_timeout (GtkClipboard *clipboard)
 /**
  * gtk_clipboard_set_can_store:
  * @clipboard: a #GtkClipboard
- * @targets: (allow-none) (array length=n_targets): array containing
- *           information about which forms should be stored or %NULL
- *           to indicate that all forms should be stored.
+ * @targets: (allow-none): The targets (data formats) in which the
+ *    functions can provide the data or %NULL
+ *    to indicate that all forms should be stored.
  * @n_targets: number of elements in @targets
  *
  * Hints that the clipboard data should be stored somewhere when the
@@ -2143,29 +2124,21 @@ gtk_clipboard_store_timeout (GtkClipboard *clipboard)
  * Since: 2.6
  */
 void
-gtk_clipboard_set_can_store (GtkClipboard         *clipboard,
-                            const GtkTargetEntry *targets,
-                            gint                  n_targets)
+gtk_clipboard_set_can_store (GtkClipboard  *clipboard,
+                            GtkTargetList *targets)
 {
   g_return_if_fail (GTK_IS_CLIPBOARD (clipboard));
-  g_return_if_fail (n_targets >= 0);
 
-  GTK_CLIPBOARD_GET_CLASS (clipboard)->set_can_store (clipboard,
-                                                      targets,
-                                                      n_targets);
+  GTK_CLIPBOARD_GET_CLASS (clipboard)->set_can_store (clipboard, targets);
 }
 
 static void
-gtk_clipboard_real_set_can_store (GtkClipboard         *clipboard,
-                                  const GtkTargetEntry *targets,
-                                  gint                  n_targets)
+gtk_clipboard_real_set_can_store (GtkClipboard  *clipboard,
+                                 GtkTargetList *targets)
 {
   GtkWidget *clipboard_widget;
-  int i;
-  static const GtkTargetEntry save_targets[] = {
-    { (char *) "SAVE_TARGETS", 0, TARGET_SAVE_TARGETS }
-  };
-  
+  guint n_atoms;
+
   if (clipboard->selection != GDK_SELECTION_CLIPBOARD)
     return;
   
@@ -2180,18 +2153,26 @@ gtk_clipboard_real_set_can_store (GtkClipboard         *clipboard,
    */  
   if (clipboard->n_storable_targets == -1)
     {
-      gtk_selection_add_targets (clipboard_widget, clipboard->selection,
-                                save_targets, 1);
+      gtk_selection_add_target (clipboard_widget,
+                                clipboard->selection,
+                                gdk_atom_intern_static_string ("SAVE_TARGETS"),
+                               TARGET_SAVE_TARGETS);
 
       /* Ref the owner so it won't go away */
       if (clipboard->have_owner)
        g_object_ref (clipboard->user_data);
     }
   
-  clipboard->n_storable_targets = n_targets;
-  clipboard->storable_targets = g_new (GdkAtom, n_targets);
-  for (i = 0; i < n_targets; i++)
-    clipboard->storable_targets[i] = gdk_atom_intern (targets[i].target, FALSE);
+  if (targets)
+    {
+      clipboard->storable_targets = gtk_target_list_get_atoms (targets, &n_atoms);
+      clipboard->n_storable_targets = n_atoms;
+    }
+  else
+    {
+      clipboard->storable_targets = NULL;
+      clipboard->n_storable_targets = 0;
+    }
 }
 
 static gboolean
index 68a68a622911743516750363cb3e01390f986ae8..29ea58581aceb9b16aa9a0fb1e65f668ad85ebf4 100644 (file)
@@ -198,15 +198,13 @@ GdkDisplay   *gtk_clipboard_get_display     (GtkClipboard *clipboard);
 
 GDK_AVAILABLE_IN_ALL
 gboolean gtk_clipboard_set_with_data  (GtkClipboard          *clipboard,
-                                      const GtkTargetEntry  *targets,
-                                      guint                  n_targets,
+                                       GtkTargetList         *targets,
                                       GtkClipboardGetFunc    get_func,
                                       GtkClipboardClearFunc  clear_func,
                                       gpointer               user_data);
 GDK_AVAILABLE_IN_ALL
 gboolean gtk_clipboard_set_with_owner (GtkClipboard          *clipboard,
-                                      const GtkTargetEntry  *targets,
-                                      guint                  n_targets,
+                                       GtkTargetList         *targets,
                                       GtkClipboardGetFunc    get_func,
                                       GtkClipboardClearFunc  clear_func,
                                       GObject               *owner);
@@ -289,8 +287,7 @@ gboolean gtk_clipboard_wait_is_target_available    (GtkClipboard  *clipboard,
 
 GDK_AVAILABLE_IN_ALL
 void gtk_clipboard_set_can_store (GtkClipboard         *clipboard,
-                                 const GtkTargetEntry *targets,
-                                 gint                  n_targets);
+                                  GtkTargetList        *targets);
 
 GDK_AVAILABLE_IN_ALL
 void gtk_clipboard_store         (GtkClipboard   *clipboard);
index 87922395965f052c50fbaba433101ef05b143e6c..d4c0b1857d02f9702d2086eb8b0bf4c721a0626e 100644 (file)
@@ -63,8 +63,7 @@ struct _GtkClipboardClass
 
   /* vfuncs */
   gboolean      (* set_contents)                (GtkClipboard                   *clipboard,
-                                                 const GtkTargetEntry           *targets,
-                                                 guint                           n_targets,
+                                                 GtkTargetList                  *targets,
                                                  GtkClipboardGetFunc             get_func,
                                                  GtkClipboardClearFunc           clear_func,
                                                  gpointer                        user_data,
@@ -75,8 +74,7 @@ struct _GtkClipboardClass
                                                  GtkClipboardReceivedFunc        callback,
                                                  gpointer                        user_data);
   void          (* set_can_store)               (GtkClipboard                   *clipboard,
-                                                 const GtkTargetEntry           *targets,
-                                                 gint                            n_targets);
+                                                 GtkTargetList                  *targets);
   void          (* store)                       (GtkClipboard                   *clipboard);
 
   /* signals */
index 7056b82556cd7213d540a113ab3795e42c481c64..185450da66f72f6dc0f70713f28e68d0ae83be52 100644 (file)
@@ -6557,10 +6557,8 @@ static void
 gtk_entry_update_primary_selection (GtkEntry *entry)
 {
   GtkTargetList *list;
-  GtkTargetEntry *targets;
   GtkClipboard *clipboard;
   gint start, end;
-  gint n_targets;
 
   if (!gtk_widget_get_realized (GTK_WIDGET (entry)))
     return;
@@ -6568,13 +6566,11 @@ gtk_entry_update_primary_selection (GtkEntry *entry)
   list = gtk_target_list_new (NULL, 0);
   gtk_target_list_add_text_targets (list, 0);
 
-  targets = gtk_target_table_new_from_list (list, &n_targets);
-
   clipboard = gtk_widget_get_clipboard (GTK_WIDGET (entry), GDK_SELECTION_PRIMARY);
   
   if (gtk_editable_get_selection_bounds (GTK_EDITABLE (entry), &start, &end))
     {
-      gtk_clipboard_set_with_owner (clipboard, targets, n_targets,
+      gtk_clipboard_set_with_owner (clipboard, list,
                                     primary_get_cb, primary_clear_cb, G_OBJECT (entry));
     }
   else
@@ -6583,7 +6579,6 @@ gtk_entry_update_primary_selection (GtkEntry *entry)
        gtk_clipboard_clear (clipboard);
     }
 
-  gtk_target_table_free (targets, n_targets);
   gtk_target_list_unref (list);
 }
 
index d2f9d5fa5d1608aca42a7c49b2901a06afd25163..4176457d57aef95ba9bbe8d96c3fa5c44a8ed764 100644 (file)
@@ -1733,8 +1733,6 @@ copy_file_location_cb (GSimpleAction *action,
     {
       GtkClipboard *clipboard;
       GtkTargetList *target_list;
-      GtkTargetEntry *targets;
-      int n_targets;
 
       clipboard = gtk_widget_get_clipboard (GTK_WIDGET (impl), GDK_SELECTION_CLIPBOARD);
 
@@ -1742,15 +1740,12 @@ copy_file_location_cb (GSimpleAction *action,
       gtk_target_list_add_text_targets (target_list, SELECTION_TEXT);
       gtk_target_list_add_uri_targets (target_list, SELECTION_URI);
 
-      targets = gtk_target_table_new_from_list (target_list, &n_targets);
-      gtk_target_list_unref (target_list);
-
-      gtk_clipboard_set_with_data (clipboard, targets, n_targets,
+      gtk_clipboard_set_with_data (clipboard, target_list,
                                    copy_file_get_cb,
                                    copy_file_clear_cb,
                                    selected_files);
 
-      gtk_target_table_free (targets, n_targets);
+      gtk_target_list_unref (target_list);
     }
 }
 
index 9f7a7d6e89187cb8dab719d53c1bf0e6fd7dcef5..ba0d7db3d6c9293b94693a242e8028d667abf0ae 100644 (file)
@@ -5230,21 +5230,17 @@ gtk_label_select_region_index (GtkLabel *label,
       if (anchor_index != end_index)
         {
           GtkTargetList *list;
-          GtkTargetEntry *targets;
-          gint n_targets;
 
           list = gtk_target_list_new (NULL, 0);
           gtk_target_list_add_text_targets (list, 0);
-          targets = gtk_target_table_new_from_list (list, &n_targets);
 
           if (clipboard)
             gtk_clipboard_set_with_owner (clipboard,
-                                          targets, n_targets,
+                                          list,
                                           get_text_callback,
                                           clear_text_callback,
                                           G_OBJECT (label));
 
-          gtk_target_table_free (targets, n_targets);
           gtk_target_list_unref (list);
 
           if (!priv->select_info->selection_node)
index 2ab9dc7b4004e6cef001caf24f73a24010cd6429..c72f695dc00fd04cb8273043345a11b4d1b43572 100644 (file)
@@ -501,6 +501,28 @@ gtk_target_list_add_uri_targets (GtkTargetList *list,
   gtk_target_list_add (list, text_uri_list_atom, 0, info);  
 }
 
+/**
+ * gtk_target_list_merge:
+ * @target: the #GtkTargetList to merge into
+ * @source: the #GtkTargeList to merge from
+ *
+ * Merges all targets from @source into @target.
+ */
+void
+gtk_target_list_merge (GtkTargetList       *target,
+                       const GtkTargetList *source)
+{
+  GList *l;
+
+  g_return_if_fail (target != NULL);
+  g_return_if_fail (source != NULL);
+
+  for (l = source->list; l; l = l->next)
+    {
+      target->list = g_list_prepend (target->list, g_slice_dup (GtkTargetPair, l->data));
+    }
+}
+
 /**
  * gtk_target_list_add_table:
  * @list: a #GtkTargetList
@@ -600,6 +622,27 @@ gtk_target_list_find (GtkTargetList *list,
   return FALSE;
 }
 
+GdkAtom *
+gtk_target_list_get_atoms (GtkTargetList *list,
+                           guint         *n_atoms)
+{
+  GdkAtom *atoms;
+  GList *l;
+  guint i, n;
+
+  n = g_list_length (list->list);
+  atoms = g_new (GdkAtom, n);
+
+  i = 0;
+  for (l = list->list; l; l = l->next)
+    atoms[i++] = ((GtkTargetPair *) l->data)->target;
+
+  if (n_atoms)
+    *n_atoms = n;
+
+  return atoms;
+}
+
 /**
  * gtk_target_table_new_from_list:
  * @list: a #GtkTargetList
@@ -938,26 +981,23 @@ gtk_selection_add_target (GtkWidget           *widget,
  * for a given widget and selection.
  **/
 void 
-gtk_selection_add_targets (GtkWidget            *widget, 
-                          GdkAtom               selection,
-                          const GtkTargetEntry *targets,
-                          guint                 ntargets)
+gtk_selection_add_targets (GtkWidget     *widget, 
+                          GdkAtom        selection,
+                          GtkTargetList *targets)
 {
   GtkTargetList *list;
-  GdkAtom *atoms = g_new (GdkAtom, ntargets);
-  guint i;
+  GdkAtom *atoms;
+  guint n_targets;
 
   g_return_if_fail (GTK_IS_WIDGET (widget));
   g_return_if_fail (selection != GDK_NONE);
   g_return_if_fail (targets != NULL);
   
   list = gtk_selection_target_list_get (widget, selection);
-  gtk_target_list_add_table (list, targets, ntargets);
-
-  for (i = 0; i < ntargets; i++)
-    atoms[i] = gdk_atom_intern (targets[i].target, FALSE);
+  gtk_target_list_merge (list, targets);
 
-  gdk_selection_add_targets (gtk_widget_get_window (widget), selection, atoms, ntargets);
+  atoms = gtk_target_list_get_atoms (targets, &n_targets);
+  gdk_selection_add_targets (gtk_widget_get_window (widget), selection, atoms, n_targets);
   g_free (atoms);
 }
 
index 200272c0b1a3d5b489b2d0c089ffb360f8769302..04f706764ed75332aa97556bd11f3d55c369f91a 100644 (file)
@@ -119,6 +119,9 @@ GDK_AVAILABLE_IN_ALL
 GtkTargetList *gtk_target_list_ref       (GtkTargetList  *list);
 GDK_AVAILABLE_IN_ALL
 void           gtk_target_list_unref     (GtkTargetList  *list);
+GDK_AVAILABLE_IN_3_94
+void           gtk_target_list_merge     (GtkTargetList         *target,
+                                          const GtkTargetList   *source);
 GDK_AVAILABLE_IN_ALL
 void           gtk_target_list_add       (GtkTargetList  *list,
                                           GdkAtom         target,
@@ -176,8 +179,7 @@ void     gtk_selection_add_target    (GtkWidget            *widget,
 GDK_AVAILABLE_IN_ALL
 void     gtk_selection_add_targets   (GtkWidget            *widget,
                                       GdkAtom               selection,
-                                      const GtkTargetEntry *targets,
-                                      guint                 ntargets);
+                                      GtkTargetList        *targets);
 GDK_AVAILABLE_IN_ALL
 void     gtk_selection_clear_targets (GtkWidget            *widget,
                                       GdkAtom               selection);
index d77432f9f7d1da5865fa861ab950afd91cd90cbd..49c1f5f71a3c518f13e4d93983978298548b95a8 100644 (file)
@@ -54,6 +54,9 @@ struct _GtkTargetList
   guint ref_count;
 };
 
+GdkAtom *gtk_target_list_get_atoms      (GtkTargetList     *targets,
+                                         guint             *n_atoms);
+
 gboolean _gtk_selection_clear           (GtkWidget         *widget,
                                          GdkEventSelection *event);
 gboolean _gtk_selection_request         (GtkWidget         *widget,
index 77d735227f1d385c08e0e5e90cd4545eb03a33b1..1636b09206dba9853f8dd158cf53d705f5e923ce 100644 (file)
@@ -57,12 +57,7 @@ typedef struct _GtkTextLogAttrCache GtkTextLogAttrCache;
 struct _GtkTextBufferPrivate
 {
   GtkTargetList  *copy_target_list;
-  GtkTargetEntry *copy_target_entries;
   GtkTargetList  *paste_target_list;
-  GtkTargetEntry *paste_target_entries;
-
-  gint            n_copy_target_entries;
-  gint            n_paste_target_entries;
 
   GtkTextTagTable *tag_table;
   GtkTextBTree *btree;
@@ -3704,8 +3699,7 @@ update_selection_clipboards (GtkTextBuffer *buffer)
            * timestamp.
            */
           gtk_clipboard_set_with_owner (clipboard,
-                                        priv->copy_target_entries,
-                                        priv->n_copy_target_entries,
+                                        priv->copy_target_list,
                                         clipboard_get_selection_cb,
                                         clipboard_clear_selection_cb,
                                         G_OBJECT (buffer));
@@ -3999,6 +3993,41 @@ gtk_text_buffer_backspace (GtkTextBuffer *buffer,
   return retval;
 }
 
+static void
+gtk_text_buffer_free_target_lists (GtkTextBuffer *buffer)
+{
+  GtkTextBufferPrivate *priv = buffer->priv;
+
+  g_clear_pointer (&priv->copy_target_list, gtk_target_list_unref);
+  g_clear_pointer (&priv->paste_target_list, gtk_target_list_unref);
+}
+
+static GtkTargetList *
+gtk_text_buffer_get_target_list (GtkTextBuffer   *buffer,
+                                 gboolean         deserializable,
+                                 gboolean         include_local)
+{
+  GtkTargetList *target_list;
+
+  target_list = gtk_target_list_new (NULL, 0);
+
+  if (include_local)
+    gtk_target_list_add (target_list,
+                         gdk_atom_intern_static_string ("GTK_TEXT_BUFFER_CONTENTS"),
+                         GTK_TARGET_SAME_APP,
+                         GTK_TEXT_BUFFER_TARGET_INFO_BUFFER_CONTENTS);
+
+  gtk_target_list_add_rich_text_targets (target_list,
+                                         GTK_TEXT_BUFFER_TARGET_INFO_RICH_TEXT,
+                                         deserializable,
+                                         buffer);
+
+  gtk_target_list_add_text_targets (target_list,
+                                    GTK_TEXT_BUFFER_TARGET_INFO_TEXT);
+
+  return target_list;
+}
+
 static void
 cut_or_copy (GtkTextBuffer *buffer,
             GtkClipboard  *clipboard,
@@ -4048,16 +4077,21 @@ cut_or_copy (GtkTextBuffer *buffer,
       gtk_text_buffer_insert_range (contents, &ins, &start, &end);
                                     
       if (!gtk_clipboard_set_with_data (clipboard,
-                                        priv->copy_target_entries,
-                                        priv->n_copy_target_entries,
+                                        priv->copy_target_list,
                                        clipboard_get_contents_cb,
                                        clipboard_clear_contents_cb,
                                        contents))
-       g_object_unref (contents);
+        {
+         g_object_unref (contents);
+        }
       else
-       gtk_clipboard_set_can_store (clipboard,
-                                     priv->copy_target_entries + 1,
-                                     priv->n_copy_target_entries - 1);
+        {
+          GtkTargetList *list;
+          
+          list = gtk_text_buffer_get_target_list (buffer, FALSE, FALSE);
+          gtk_clipboard_set_can_store (clipboard, list);
+          gtk_target_list_unref (list);
+        }
 
       if (delete_region_after)
         {
@@ -4186,62 +4220,6 @@ gtk_text_buffer_end_user_action (GtkTextBuffer *buffer)
     }
 }
 
-static void
-gtk_text_buffer_free_target_lists (GtkTextBuffer *buffer)
-{
-  GtkTextBufferPrivate *priv = buffer->priv;
-
-  if (priv->copy_target_list)
-    {
-      gtk_target_list_unref (priv->copy_target_list);
-      priv->copy_target_list = NULL;
-
-      gtk_target_table_free (priv->copy_target_entries,
-                             priv->n_copy_target_entries);
-      priv->copy_target_entries = NULL;
-      priv->n_copy_target_entries = 0;
-    }
-
-  if (priv->paste_target_list)
-    {
-      gtk_target_list_unref (priv->paste_target_list);
-      priv->paste_target_list = NULL;
-
-      gtk_target_table_free (priv->paste_target_entries,
-                             priv->n_paste_target_entries);
-      priv->paste_target_entries = NULL;
-      priv->n_paste_target_entries = 0;
-    }
-}
-
-static GtkTargetList *
-gtk_text_buffer_get_target_list (GtkTextBuffer   *buffer,
-                                 gboolean         deserializable,
-                                 GtkTargetEntry **entries,
-                                 gint            *n_entries)
-{
-  GtkTargetList *target_list;
-
-  target_list = gtk_target_list_new (NULL, 0);
-
-  gtk_target_list_add (target_list,
-                       gdk_atom_intern_static_string ("GTK_TEXT_BUFFER_CONTENTS"),
-                       GTK_TARGET_SAME_APP,
-                       GTK_TEXT_BUFFER_TARGET_INFO_BUFFER_CONTENTS);
-
-  gtk_target_list_add_rich_text_targets (target_list,
-                                         GTK_TEXT_BUFFER_TARGET_INFO_RICH_TEXT,
-                                         deserializable,
-                                         buffer);
-
-  gtk_target_list_add_text_targets (target_list,
-                                    GTK_TEXT_BUFFER_TARGET_INFO_TEXT);
-
-  *entries = gtk_target_table_new_from_list (target_list, n_entries);
-
-  return target_list;
-}
-
 /**
  * gtk_text_buffer_get_copy_target_list:
  * @buffer: a #GtkTextBuffer
@@ -4267,9 +4245,7 @@ gtk_text_buffer_get_copy_target_list (GtkTextBuffer *buffer)
 
   if (! priv->copy_target_list)
     priv->copy_target_list =
-      gtk_text_buffer_get_target_list (buffer, FALSE,
-                                       &priv->copy_target_entries,
-                                       &priv->n_copy_target_entries);
+      gtk_text_buffer_get_target_list (buffer, FALSE, TRUE);
 
   return priv->copy_target_list;
 }
@@ -4299,9 +4275,7 @@ gtk_text_buffer_get_paste_target_list (GtkTextBuffer *buffer)
 
   if (! priv->paste_target_list)
     priv->paste_target_list =
-      gtk_text_buffer_get_target_list (buffer, TRUE,
-                                       &priv->paste_target_entries,
-                                       &priv->n_paste_target_entries);
+      gtk_text_buffer_get_target_list (buffer, TRUE, TRUE);
 
   return priv->paste_target_list;
 }
index e6d029ac94df367832309667e88fb12a15a631bf..c6a8e41d8a8e3c4ed6cf3c5dbf4b65ec0ce71d30 100644 (file)
@@ -401,6 +401,7 @@ main (int argc, char *argv[])
     { "COMPOUND_TEXT", 0, COMPOUND_TEXT }
   };
   static gint ntargets = sizeof(targetlist) / sizeof(targetlist[0]);
+  GtkTargetList *list;
   
   gtk_init ();
 
@@ -432,8 +433,9 @@ main (int argc, char *argv[])
   g_signal_connect (selection_widget, "selection_received",
                    G_CALLBACK (selection_received), NULL);
 
-  gtk_selection_add_targets (selection_widget, GDK_SELECTION_PRIMARY,
-                            targetlist, ntargets);
+  list = gtk_target_list_new (targetlist, ntargets);
+  gtk_selection_add_targets (selection_widget, GDK_SELECTION_PRIMARY, list);
+  gtk_target_list_unref (list);
 
   g_signal_connect (selection_widget, "selection_get",
                    G_CALLBACK (selection_get), NULL);
index e665ff7bfb557840869c75ea71334e049a4bfae5..dee58b94170a9c071a98832a7edff0d94a04a5fb 100644 (file)
@@ -70,8 +70,11 @@ test_with_data (void)
 {
     GtkClipboard *clipboard = gtk_clipboard_get_for_display (gdk_display_get_default (), GDK_SELECTION_CLIPBOARD);
     GtkTargetEntry entries[] = { { .target = TARGET_TEXT, .info = 42 } };
+    GtkTargetList *targets;
 
-    gtk_clipboard_set_with_data (clipboard, entries, G_N_ELEMENTS(entries), test_with_data_get, NULL, NULL);
+    targets = gtk_target_list_new (entries, G_N_ELEMENTS(entries));
+    gtk_clipboard_set_with_data (clipboard, targets, test_with_data_get, NULL, NULL);
+    gtk_target_list_unref (targets);
     gtk_clipboard_request_contents (clipboard, gdk_atom_intern (TARGET_TEXT, FALSE), test_with_data_got, NULL);
 }